package com.company.common.config;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.Resource;

/**
 * 权限aop
 *
 * @author xuke
 * @date 2021/03/29 21:04
 **/
@Aspect
@Component
@Order(2)
public class PermissionAspect {

    private static final Logger logger = LogManager.getLogger(PermissionAspect.class);

//    @Resource
//    RolePermissionService rolePermissionService;

    /**
     * 以自定义注解 Permission 为切入点
     */
    @Pointcut(value = "@within(com.company.common.config.Permission)")
    public void permissionPointcut() {
    }


    @After("permissionPointcut()")
    public void after() throws Throwable {
    }

    /**
     * 权限前置增强
     */
    @Before("permissionPointcut()&&@within(permissionTarget)")
    public void before(JoinPoint pjp, Permission permissionTarget) throws Throwable {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes == null) {
            return;
        }

//        //当前请求request
//        HttpServletRequest request = attributes.getRequest();
//
//        //获取token
//        String token = request.getHeader("token");
//        if (StringUtils.isEmpty(token)) {
//            token = request.getParameter("token");
//        }
//
//        try {
//            String userJson = RedisUtil.get(token);
//            UserEntity userEntity = JSONObject.parseObject(userJson, UserEntity.class);
//        }

        //        //切入点方法内容
        //        MethodSignature music = (MethodSignature) pjp.getSignature();
        //        //类上注解
        //        Method targetMethod = pjp.getTarget().getClass().getDeclaredMethod(music.getName(), music.getMethod().getParameterTypes());
        //        //方法上注解
        //        Method method = music.getMethod();
        //        //当前切面方法or类的权限 key
        //        PermissionEnum[] enums = null;
        //        //方法上注解是否有注解
        //        if (null != method.getAnnotation(Permission.class)) {
        //            //有方法注解,方法注解最大
        //            enums = method.getAnnotation(Permission.class).value();
        //        }
        //        else {
        //            //获取类注解中的参数    权限enum
        //            enums = permissionTarget.value();
        //        }
        //        //验证方法
        //        isPermission(enums,token);

    }


//    void isPermission(PermissionEnum[] enums, String token) {
//        if (StringUtils.isEmpty(token)) {
//            throw new BizException("001", "token不存在");
//        }
//        //验证当前是否为公共接口
//        if (enums[0] == PermissionEnum.PUBLIC_PERMISSION) {
//            //公共接口无需验证权限
//        }
//        else {
//            //获取当前用户 roleId
//            UserEntity userEntity = JSONObject.parseObject(RedisUtil.get(token), UserEntity.class);
//            //从缓存中获取全部
//            List<RoleEntity> roleEntities = JSONObject.parseArray(RedisUtil.get("Role" + userEntity.getUserId()), RoleEntity.class);
//            RedisUtil.expire("Role" + userEntity.getUserId(), 3, TimeUnit.HOURS);
//            String roleId = userEntity.getRoleId();
//            String schoolId = userEntity.getZeroSchoolId();
//            List<String> redisKeys = new ArrayList<>();
//            if (CollUtil.isNotEmpty(roleEntities)) {
//                roleEntities.stream().forEach(item -> {
//                    String redisKey = "Permission" + item.getRoleId() + "/||" + schoolId;
//                    redisKeys.add(redisKey);
//                });
//            }
//
//            for (String redisKey : redisKeys) {
//                //redis 中取出权限内容
//                if (!RedisUtil.hasKey(redisKey)) {
//                    //当前redis中没有权限重新获取
//                    rolePermissionService.isSetRedisPermission(null, schoolId);
//                    break;
//                }
//            }
//            logger.info("PermissionAspect:>>>>>>>>>>>角色ID:" + roleId + "学校ID:" + schoolId + "权限Key:" + Convert.toStr(redisKeys) + "<<<<<<<<<<<<");
//            //验证权限
//            rolePermissionService.isPermissionKey(redisKeys, enums);
//        }
//    }
}
